.SILENT:

# ESTE ES EL MAKEFILE PARA UTILIDADES. 
# DEBE EJECUTARSE CON EL COMANDO MAKE. PARA VOLVER EL DIRECTORIO A SU ESTADO ORIGINAL
# UTILIZAR EL COMANDO MAKE CLOSE.
# EN CASO DE QUERER COMPILAR EN MODO SILENCIOSO, EJECUTAR MAKE SILENCE

#DIRECTORIO DONDE SE EJECUTO EL MAKE
MAKE_DIR = $(shell pwd)

#COMPILADOR POR DEFAULT
CC=gcc

# DIRECTIVAS DEL COMPILADOR
CFLAGS=-g -Wall -std=c99 -pedantic

# NOMBRE DEL PROGRAMA PRICIPAL
EXEC=integracion_parser_dir_explorer

# BIBLIOTECAS PARA EL PROGRAMA PRINCIPAL
SRC=$(wildcard *.c)

# CODIGO OBJETO DE LAS BIBLIOTECAS DEL PROGRAMA PRINCIPAL
OBJS=

#Ubicacion de las libs externas
LIBS_DIR= ../tda/lista/ ../utilidades/ ../tda/abb_avl/ ../tda/vector_dinamico/ ../tda/pila/ ../utilidades/termino/ ../utilidades/dir_explorer/ ../parser/ ../tda/cola/ ../utilidades/merge/ ../tda/termino_merge/ ../tda/buffer_merge ../tda/heap ../construccion_matriz

# CODIGO OBJETO DE LAS DEPENDECIAS EXTERNAS
LIBS= ../tda/lista/lista.o ../utilidades/utilidades.o ../utilidades/merge/merge.o ../tda/abb_avl/abb_avl.o ../tda/vector_dinamico/vector_dinamico.o ../tda/pila/pila.o ../utilidades/termino/termino.o ../utilidades/dir_explorer/dir_explorer.o ../parser/parser.o ../tda/cola/cola.o  ../tda/termino_merge/termino_merge.o ../tda/buffer_merge/buffer_merge.o ../tda/heap/heap.o ../construccion_matriz/matriz_svdlibc.o

# Ruta relativa de los headers
HEADERS_DIR= ../tda/lista/lista.h ../utilidades/utilidades.h ../tda/abb_avl/abb_avl.h ../tda/vector_dinamico/vector_dinamico.h ../tda/pila/pila.h ../utilidades/termino/termino.h ../utilidades/dir_explorer/dir_explorer.h ../parser/parser.h ../tda/cola/cola.h ../utilidades/merge/merge.h  ../tda/termino_merge/termino_merge.h ../tda/buffer_merge/buffer_merge.h  ../tda/heap/heap.h ../construccion_matriz/matriz_svdlibc.h

# HEADERS DE LAS DEPENDENCIAS EXTERNAS 
HEADERS= lista.h utilidades.h abb_avl.h vector_dinamico.h pila.h termino.h dir_explorer.h parser.h cola.h merge.h termino_merge.h buffer_merge.h heap.h matriz_svdlibc.h

# DIRECTIVAS DEL MEM CHECK
VFLAGS= valgrind --leak-check=full --show-reachable=yes --track-origins=yes

# DEFAULT
all: prepare $(EXEC)

# SILENT DEFAULT
silent: sprepare s$(EXEC) 

# COMPILA DEPENDECIAS EXTERNAS
prepare:
	echo Compilando librerias externas
	$(foreach dir,$(LIBS_DIR),\
		echo -n $(dir)... ;\
		cd $(dir); make objects; \
		echo Listo;\
		cd $(MAKE_DIR);)
	cp $(HEADERS_DIR) ./



# CONSTRUYE EL PROGRAMA PRINCIPAL
$(EXEC): prepare $(OBJS)
	echo -n Compilando el programa principal...
	$(CC) $(CFLAGS) $(LIBS) $(OBJS) $(SRC) -o $(EXEC) -lm
	rm -f $(HEADERS) *.o
	echo OK

# LIMPIA EL DIRECTORIO BASE
clean:
	$(foreach dir,$(LIBS_DIR),\
		cd $(dir);make clean; \
		cd $(MAKE_DIR);)
	rm -f *.o $(EXEC) $(HEADERS) output-* file-id 
	
# CORRE EL PROGRAMA PRINCIPAL
run: 
	echo Corriendo pruebas...
	./$(EXEC)

# CORRE PRUEBAS DE MEMORIA SOBRE EL PROGRAMA PRINCIPAL
test: 
	echo Corriendo pruebas en modo memCheck...
	$(VFLAGS) ./$(EXEC)
	
# LIMPIA LOS DIRECTORIOS DE LAS DEPENDENCIAS EXTERNAS
close: clean
	$(foreach dir,$(LIBS_DIR),\
		cd $(dir);make close; \
		cd $(MAKE_DIR);)

	
# SILENT PREPARE
sprepare: clean
	cd ../tda/lista; make silent
	cp $(HEADERS_DIR) ./

# SILENT %.o
s$(OBJS):
	$(CC) $(CFLAGS) -c $(SRC) -lm

# SILENT $(EXEC)
s$(EXEC): s$(OBJS)
	$(CC) $(CFLAGS) $(LIBS) $(OBJS) $(HEADERS) -o $(EXEC) -lm
